/**
 * @file DownloadEngine.h
 * @author w
 * @brief http功能类
 * @version 0.1
 * @date 2024-04-26
 *
 * @copyright Copyright (c) 2024 xxxx公司
 *
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2024-04-26 <td>v1.0     <td>chen     <td>内容
 * </table>
 */
#ifndef DOWNLOADENGINE_H
#define DOWNLOADENGINE_H
#include "curl/curl.h"
#include "json/json.h"
#include <list>
#include <map>
#include <mutex>
#include <thread>

/**
 * @brief CUrlInit类, 初始化libcurl库.
 *
 * @details
 */
class CUrlInit {
public:
  /**
   * @brief 构造函数
   *
   * @details
   */
  CUrlInit();
  /**
   * @brief 析构函数
   *
   * @details
   */
  ~CUrlInit();

protected:
  static CUrlInit m_initialize; ///< 静态 CUrlInit实例
};

/**
 * @brief CCurlDownload类
 *
 * @details 使用libcurl库实现下载.
 */

class CCurlDownload {
public:
  /**
   * @brief 构造函数
   *
   * @details
   */
  CCurlDownload();
  /**
   * @brief 析构函数
   *
   * @details
   */
  ~CCurlDownload();
  /**
   * @brief 以http方式下载文件.
   * @param [in] pszUrl 下载地址.
   * @param [in] pszLocalFile 本地文件名(全路径).
   * @return true 下载成功.
   * @return false 下载失败.
   *
   * @details
   */
  bool getFile(const char *pszUrl, const char *pszLocalFile);
  /**
   * @brief 试验恢复查询接口
   * @param [in] trialRecoryUrl 服务接口
   * @param [in] reponse
   * @return true
   * @return false
   *
   * @details
   * 服务接口
   * http://192.168.1.32/blade-ddlvc/lvc-api/queryStateTopic?experId=1734867845973061634&appCode=App2_shoukong&lbts=75.0000991821289
   * 配置文件中需要配置
   */
  bool getTrialRecory(const std::string trialRecoryUrl, std::string &reponse);

protected:
  /**
   * @brief http下载回调函数,保存下载文件.
   * @param [in] contents 输出数据的指针.
   * @param [in] size 写入的字节数.
   * @param [in] nmemb 写入size字节的数据项个数.
   * @param [in] userp 目标文件指针.
   * @return size_t 实际写入数据项的个数.
   *
   * @details
   */
  static size_t writeCallBack(void *contents, size_t size, size_t nmemb,
                              void *userp);
  /**
   * @brief http post方法
   * @param [in] url 服务地址
   * @param [in] data post请求参数 例如 "name=daniel&project=curl"
   * @param [in] reponse 服务响应
   * @return true 成功
   * @return false 失败
   *
   * @details
   */
  bool httpPost(const std::string &url, const std::string &data,
                std::string &reponse);
  /**
   * @brief http get方法
   * @param [in] url 服务地址
   * @param [in] reponse  服务响应
   * @return true 成功
   * @return false 失败
   *
   * @details
   */
  bool httpGet(const std::string &url, std::string &reponse);

protected:
  CURL *m_pCurlHandle = nullptr; ///< CURL对象指针
};

DOWNLOADENGINE_H
#endif // CDOWNLOAD_H
